home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / _archvrs / unix / freeze-2.lha / freeze / bitio.h < prev    next >
C/C++ Source or Header  |  1993-02-22  |  2KB  |  66 lines

  1. /* Some definitions for faster bit-level I/O */
  2. /* Assumptions: local variables "loclen" and "locbuf" are defined
  3.  * via "DefBits";
  4.  * AvailBits() is called before all bit input operations, the
  5.  * maximum allowed argument for AvailBits() is bits(bitbuf) -7;
  6.  * FlushBits() is called often enough while bit output operations;
  7.  * KeepBits() is called as opposite to DefBits.
  8.  */
  9.  
  10. extern unsigned bitbuf; /* Bit I/O buffers */
  11. extern int  bitlen;     /* Number of bits actually in `bitbuf' */
  12. extern int  overrun;    /* at least as many bytes were read as EOF */
  13. extern long bytes_out;  /* we use it, we declare it */
  14.  
  15. #define bits(x) ((int)sizeof(x)*8)
  16. #define BYSH  (bits(bitbuf)-8)
  17. #define BISH  (bits(bitbuf)-1)
  18.  
  19. #define InitIO()        { overrun = bitlen = 0; bitbuf = 0; }
  20.  
  21. #define DefBits         register unsigned locbuf = bitbuf;\
  22. register int loclen = bitlen
  23.  
  24. #define FillBits()   if (loclen <= bits(bitbuf) - 8) {\
  25.     do {\
  26.         locbuf |= (unsigned)(getchar() & 0xFF) << (BYSH - loclen);\
  27.         loclen += 8;\
  28.     } while (loclen <= bits(bitbuf) - 8);\
  29. if (feof(stdin)) overrun++;\
  30. }
  31.  
  32. #define FlushBits() if (loclen >= 8) do {\
  33.     putchar ((int)(locbuf >> BYSH));\
  34.     bytes_out++;\
  35.     locbuf <<= 8;\
  36.     loclen -= 8;\
  37. } while (loclen >= 8)
  38.  
  39. /* FlushTail works with global variables !! */
  40. #define FlushTail() if (bitlen) {\
  41.     putchar((int)(bitbuf >> BYSH));\
  42.     bytes_out++;\
  43. }
  44.  
  45. #define KeepBits()      bitbuf = locbuf, bitlen = loclen
  46.  
  47. /* GetX() macros may be used only in "var op= GetX();" statements !! */
  48.  
  49. #define GetBit()  /* var op= */locbuf >> BISH, locbuf <<= 1, loclen--
  50.  
  51. #define GetByte() /* var op= */locbuf >> BYSH, locbuf <<= 8, loclen -= 8
  52.  
  53. /* NB! `n' is used more than once here! */
  54. #define GetNBits(n) /* var op= */ locbuf >> (bits(bitbuf) - (n)),\
  55.     locbuf <<= (n), loclen -= (n)
  56.  
  57. /* Puts n MSBs of var to the stream, assume other bits == 0 */
  58. #define PutNBits(var, n) locbuf |= (unsigned)(var) >> loclen, loclen += (n)
  59.  
  60. /* Puts n LSBs of var to the stream, assume other bits == 0 */
  61. #define PutNLowBits(var, n) locbuf |= (unsigned)(var) << (bits(bitbuf) -\
  62. (n) - loclen), loclen += (n)
  63.  
  64. /* Puts LSB (!) of var to the stream, isn't used now */
  65. #define PutBit(var) locbuf |= (unsigned)((var) & 1) << (BISH - loclen), loclen++
  66.